#include<event2/event.h>
#include<signal.h>
#include<iostream>
#include <string.h>
#include <event2/listener.h>
#include <event2/bufferevent.h>
using namespace std;
static string recvstr="";
static int recvCount=0;
void read_cb(bufferevent *bev,void *arg)
{
    char data[1024]={0};
    //读取输入缓冲的数据
    int len=bufferevent_read(bev,data,sizeof(data)-1);
    cout<<data<<flush;
    if(len<=0)return;
    recvstr+=data;
    recvCount+=len;
    // if(strstr(data,"quit")!=NULL)
    // {
    //     cout<<"quit"<<endl;
    //     //退出并关闭soket
    //     bufferevent_free(bev);
    // }
    //发送数据 写入到输出缓冲
    bufferevent_write(bev,"okkkkk",6);
}
void write_cb(bufferevent *bev,void *arg)
{
    cout<<"[W]"<<flush;
}
//错误 ，超时，连接断开会进入
void event_cb(bufferevent *bev, short what, void *ctx)
{
    cout<<"[E]"<<flush;
    if(what & BEV_EVENT_TIMEOUT)
    {
        //读取缓冲中数据
        char data[1024]={0};
    //读取输入缓冲的数据
        int len=bufferevent_read(bev,data,sizeof(data)-1);
        if(len>0) {
            recvstr+=data;
            recvCount+=len;
        }
        cout<<"BEV_EVENT_TIMEOUT"<<endl;
        cout<<recvstr<<endl;
        cout<<"recvCount:"<<recvCount<<endl;
    }

}
void listen_cb(evconnlistener * ev, evutil_socket_t s, struct sockaddr * a, int socklen, void *arg)
{
    cout<<"listen_cb"<<endl;
    event_base *base=(event_base*)arg;
    //创建buffevent上下文 BEV_OPT_CLOSE_ON_FREE：清理bufferevent时关闭socket
    bufferevent* bev = bufferevent_socket_new(base,s,BEV_OPT_CLOSE_ON_FREE);
    //添加读写权限
    bufferevent_enable(bev,EV_READ|EV_WRITE);
    //设置回调函数
    //设置水位
    //设置读取水位
    // bufferevent_setwatermark(bev,EV_READ,
    //     10,//低水位
    //     0//高水位，0就是不限制 默认为0
    // );
    //高水位
    // bufferevent_setwatermark(bev,EV_READ,
    //     0,//低水位
    //     10//高水位，0就是不限制 默认为0
    // );
    //设置写入水位
    // bufferevent_setwatermark(bev,EV_WRITE,
    //     0,//低水位
    //     5//高水位,写入高水位无效
    // );
    //超时时间的设置
    timeval t1={3,0};
    bufferevent_set_timeouts(bev,&t1,NULL);
    bufferevent_setcb(bev,read_cb,write_cb,event_cb,base);
}
int main(int argc,char **argv)
{
    if(signal(SIGPIPE,SIG_IGN)==SIG_ERR)
    {
        return 1;
    }
    event_base *eb=event_base_new();
    //创建网络服务器
    sockaddr_in sin;
    memset(&sin,0,sizeof(sin));
    sin.sin_family=AF_INET;
    sin.sin_port=htons(6666);
    evconnlistener *ec = evconnlistener_new_bind(eb,
        listen_cb,
        eb,
        LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE,
        10,
        (sockaddr *)&sin,
        sizeof(sin)
    );
    
    event_base_dispatch(eb);

    evconnlistener_free(ec);
    event_base_free(eb);
    
    return 0;
}